import asyncio
import logging
import os
from typing import Optional

from lxautoplat.case import CrawlerService

from crawler.page.ps_page_list import PSPage
from crawler.page.sms_page_list import SMSPage
from crawler.service.automation_platform_request import global_automation_platform

LOGGER = logging.getLogger(__name__)


async def delete_file(file_path: str) -> None:
    """
    异步删除指定路径的文件，并记录相应日志。

    :param file_path: 要删除的文件路径
    """
    try:
        if os.path.exists(file_path) and os.path.isfile(file_path):
            os.remove(file_path)
            LOGGER.info(f'删除 {file_path} 文件成功。')
        else:
            LOGGER.warning(f'文件 {file_path} 不存在或不是文件，无需删除。')
    except PermissionError:
        LOGGER.error(f'删除 {file_path} 文件时权限不足。', exc_info=True)
    except OSError as e:
        LOGGER.error(f'删除 {file_path} 文件时系统操作出错: {e}', exc_info=True)


class IndustrialService(CrawlerService):
    async def _validate_context(self) -> Optional[object]:
        """
        验证 self.context 是否包含 pages 属性且 pages 不为空。

        :return: 若验证通过，返回第一个页面对象；否则返回 None
        """
        try:
            pages = self.context.pages
        except AttributeError:
            LOGGER.error("self.context 没有 pages 属性")
            raise
        if not pages:
            LOGGER.error("没有打开页面")
            raise ValueError("没有打开页面")
        return pages[0]

    async def run_script(self, search: object, script_type: str) -> None:
        """
        运行指定类型的脚本，包括删除文件、提取数据并写入 Excel。

        :param search: 搜索相关参数
        :param script_type: 脚本类型，支持 "sms" 和 "ps"
        """
        try:
            # 验证上下文并获取第一个页面
            page = await self._validate_context()

            # 刷新当前页面
            await page.reload()

            await asyncio.sleep(1)

            # 删除文件
            file_path = global_automation_platform.file_path
            LOGGER.info("开始删除文件: %s", file_path)
            await delete_file(file_path)

            # 执行页面脚本，提取数据并写入 Excel
            LOGGER.info("开始执行页面脚本->提取数据并写入 Excel")
            if script_type == "sms":
                await SMSPage(page).data_write_excel(search, file_path)
            elif script_type == "ps":
                await PSPage(page).data_write_excel(search, file_path)
            LOGGER.info("表格数据已成功写入到文件: %s", file_path)
        except AttributeError:
            LOGGER.error("self.context 没有 pages 属性，任务终止")
            raise
        except ValueError as e:
            LOGGER.error(str(e), exc_info=True)
            raise
        except (FileNotFoundError, PermissionError) as e:
            LOGGER.error("文件操作出错: %s", str(e), exc_info=True)
            raise
        except Exception as e:
            LOGGER.error("获取页面数据时出现未知错误: %s", str(e), exc_info=True)
            raise
